import axios from 'axios'
const http = axios.create({
    baseURL: '/',
    // baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
    // withCredentials: true, // send cookies when cross-domain requests
    timeout: 5000
    // request timeout
})

// 使用Map代替数组来管理pending请求，优化查找和删除性能
const pending = new Map()
const CancelToken = axios.CancelToken

// 抽象化处理取消逻辑
const handleCancel = (config) => {
    const cancelToken = new CancelToken(c => { // 直接使用Map的set方法添加取消函数和相关信息
        pending.set(config.url + '&' + config.method, c)
    })
    config.cancelToken = cancelToken
}

// 移除指定请求
const removePending = (config) => {
    const key = config.url + '&' + config.method
    if (pending.has(key)) {
        const cancelFn = pending.get(key)
        if (typeof cancelFn === 'function') {
            cancelFn('cancel')
        }
        pending.delete(key)
    }
}

// 处理用户认证信息
const handleUserInfo = (config) => {
    try {
        const userInfo = JSON.parse(localStorage.getItem('userInfo'))
        if (userInfo && userInfo.access_token) {
            config.headers.Authorization = `bearer ${userInfo.access_token}`
        }
    } catch (error) { // 根据项目需求考虑是否需要进一步处理异常，比如降级处理
        console.error('Error parsing userInfo from localStorage:', error)
    }
}

// 请求拦截器
axios.interceptors.request.use(config => {
    handleUserInfo(config) // 处理用户认证信息
    let token=''
    if(localStorage.getItem('user')){
        token=JSON.parse(localStorage.getItem('user')).token
    }
    
    config.headers={
        ...config.headers,
        token:token
    }
    if (['get', 'post'].includes(config.method) && (config.params || config.data)) { // 根据请求类型处理取消逻辑
        const cancelBeforeRequest = config.method === 'get' ? config.params.cancelBeforeRequest : config.data.cancelBeforeRequest
        if (cancelBeforeRequest === 'yes') {
            removePending(config)
            handleCancel(config)
        }
    }
    return config
}, error => {
    return Promise.reject(error)
})

// 添加响应拦截器
axios.interceptors.response.use(response => {
    return response
}, error => {
    if (error.response) {
        switch (error.response.status) {
            case 401:
                // 返回 401 清除token信息并跳转到登录页面
                localStorage.removeItem('userInfo')
                window.location.href = '/login'
                Message({
                    message: error.response.message,
                    type: 'error'
                })
        }
    }
    return Promise.reject(error && error.response && error.response.data ? error.response.data : '') // 返回接口返回的错误信息
})
// 封装get方法
export function get({ url, params }) {
    return new Promise((resolve, reject) => {
        axios.get(url, {
            params: params
        }).then(res => {
            resolve(res.data)
        }).catch(err => {
            reject(err && err.data)
        })
    })
}

// 封装post方法
export function post({ url, data, timeout }) {
    if (timeout) {
        return new Promise((resolve, reject) => {
            axios.post(url, data, { timeout: timeout }).then(res => {
                resolve(res.data)
            }).catch(err => {
                reject(err && err.data)
            })
        })
    } else {
        return new Promise((resolve, reject) => {
            axios.post(url, data).then(res => {
                resolve(res.data)
            }).catch(err => {
                reject(err && err.data)
            })
        })
    }
}

